/**
 * enchant.js Game FrameWork拡張
 * enchant.jsをより簡単に使えるようにする拡張
 * _[アンダーバー]からはじまるメソッドはprivateとする
 * 不具合修正や基本機能拡張以外の目的で弄ってはいけない
 *
 * @author  kamisiro.memo<kamisiro.memo@gmail.com>
 */
var JGZ = {}
JGZ.Fw  = {};
/**
 * @scope JGZ.Fw.Base.prototype
 */
JGZ.Fw.Base = enchant.Class.create({
  /**
   * Fwを継承したら必ず呼び出す
   */
  initialize : function() {
    this.gameObj    = null;
    this.url        = null;
    this.params     = null;
    this.game       = {};
    this.images     = null;
    this.image_path = {};
    this.sounds     = null;
    this.sound_path = {};
    this.timer      = null;

    this.options    = {
      "map_width"   : 320,
      "map_height"  : 320,
      "fps"         : 15,
      "time"        : 0,
      "TIMER"       : true
    };
  },
  
  /**
   * ゲーム実行
   * 処理の順番としてはURL解析、パラメータマージ、固有初期化処理、ゲームインスタンス作成、画像等のpreload、メイン処理実行
   */
  run : function(){
    this._init();
    this._gInstanse();
    this._preload();
    this._main();
  },

  /**
   * ゲーム固有の初期化処理がある場合はここに記述
   * image_pathやsound_pathはここで作成して格納しておく
   * @Override
   */
  init : function() {
  },

  /**
   * preload
   * 基本の画像以外にもpreloadしておきたい場合...
   * 通常のゲームでは何もかかなくてOKだと思われる...
   * @Override
   */
  preload : function() {
  },

  /**
   * ゲームごとの初期化処理
   * @Override
   */
  gameInit : function() {
             
  },

  /**
   * ゲーム起動画面処理
   * @Override
   */
  gameStart : function () {
  },

  /**
   * ゲームメイン画面処理
   * @Override
   */
  gameMain : function () {
  },

  /**
   * ゲーム終了画面処理
   * @Override
   */
  gameEnd : function () {
  },

  /**
   * FW固有初期化処理
   */
  _init : function() {
    //URL解析
    this.urlParse();
    //オプションパラメータインスタンス化
    this.params = new enchant.JGZ.ObjectEx(this.options);
    //URLパラメータとオプションパラメータをマージ
    this.params.apply(this.url.params);
    //各ゲーム固有初期化処理を実行
    this.init();
  },

  /**
   * ゲームインスタンス生成
   * 基本弄ってはいけない
   */
  _gInstanse : function() {
    this.gameObj = new Game(this.params.o.map_width, this.params.o.map_height);
    this.gameObj.fps = this.params.o.fps;
  },

  /**
   * 素材のpreload処理
   * 基本弄ってはいけない
   */
  _preload : function() {
    if (this.image_path !== false) {
      JGZ.Fw.Image = this.images = new enchant.JGZ.Images(this.image_path);
    }
    if (this.sound_path !== false) {
      JGZ.Fw.Sound = this.sounds = new enchant.JGZ.Sounds(this.sound_path);
    }
    this.preload();
  },

  /**
   * URLパース部分
   * ここを上書きする事でURL解析時に独自の処理を追加可能
   */
  urlParse : function() {
    this.url = new enchant.JGZ.URLParser(location.search);
    this.url._parse();
  },

  /**
   * タイマー
   * メイン処理の中で this.game.timer を上書きする事でオリジナルのタイマー表示に変更可能
   */
  _timer : function() {
    this.game.timer = {};

    if (this.params.o.TIMER) {
      this.game.timer = new enchant.JGZ.Timer({
        "x"     : 1,
        "y"     : 1,
        "text"  : this.params.o.time,
        "font"  : '18px Arial',
        "color" : '#000000',
        "time"  : this.params.o.time
      });
    }
  },

  /**
   * ゲームメイン処理呼出部分
   * ここは基本的に弄らない
   */
  _main : function() {
    var that = this;
    this.gameObj.onload = function() {
      //ImageResource実体化
      if (that.images !== null) {
        that.images.readAllResource();
      }
      //SoundResource実体化
      if (that.sounds !== null) {
        that.sounds.readAllResource();
      }

      that._gameInit();
      that._gameStart();
      that._gameMain();
      that._gameEnd();
    }
    
    //ゲーム開始
    this.gameObj.start();
  },
  
  /**
   * ゲームごとの初期化処理
   * window.onload時とはまた別
   * タイマーやゲーム内で使用する変数の初期化などを行う
   * 上書きしてはいけない
   */
  _gameInit : function() {
    this.game.params  = {};
    this.game.scene   = {
      'start'   : new Scene(),
      'main'    : new Scene(),
      'end'     : new Scene()
    };
    this._timer();
    this.gameInit();
  },

  _gameStart : function() {
    this.gameStart();
    this.gameObj.pushScene(this.game.scene['start']);
  },
  _gameMain : function() {
    this.gameMain();
  },
  _gameEnd : function() {
    this.gameEnd();
  }
});
